home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / skeleton.zip / WinMain.asm < prev    next >
Assembly Source File  |  1996-06-02  |  3KB  |  148 lines

  1.         TITLE    WinMain
  2.         INCLUDE    COMMON.INC
  3.  
  4.  
  5.         .CONST
  6. szClassName    SBYTE    "Skeleton",0h
  7.  
  8.  
  9.         .DATA?
  10. hInst        HINSTANCE ?
  11. lpCmdLine    LPSTR    ?
  12. nCmdShow    SDWORD    ?
  13.  
  14. szWindowName    SBYTE    (MAX_PATH + 10h) DUP (0h)
  15.  
  16. hMainWnd    HWND    ?
  17. hAccel        HACCEL    ?
  18.  
  19.  
  20.         .CODE
  21. Start:        INVOKE    GetModuleHandle, NULL
  22.         mov    hInst,eax
  23.         INVOKE    GetCommandLine
  24.         mov    lpCmdLine,eax
  25.         mov    nCmdShow,SW_SHOWDEFAULT
  26.  
  27.         INVOKE    WinMain, hInst, 0h, lpCmdLine, nCmdShow
  28.         INVOKE    ExitProcess, eax    ;eax=Exit Code
  29.  
  30.  
  31. OnlyOneInstance    PROC    STDCALL
  32.         LOCAL    hSemaphore:HANDLE
  33.  
  34.         INVOKE    CreateSemaphore, NULL, 0h, 1h, ADDR szClassName
  35.         mov    hSemaphore,eax
  36.  
  37.         INVOKE    GetLastError
  38.         cmp    eax,ERROR_ALREADY_EXISTS
  39.         je    caseEXISTS
  40.         cmp    eax,ERROR_SUCCESS
  41.         je    caseONLYONE        ;if not equal then CreateSemaphore failed so
  42.         jmp    caseFIND        ;return FALSE to exit by trying FindWindow
  43.  
  44. caseONLYONE:    mov    eax,TRUE        ;created Semaphore will prevent other instances
  45.         jmp    caseRETURN        ;return TRUE to continue
  46.  
  47. caseEXISTS:    INVOKE    CloseHandle, hSemaphore
  48.  
  49. caseFIND:    INVOKE    FindWindow, ADDR szClassName, NULL
  50.         test    eax,eax
  51.         jz    caseRETURN        ;return FALSE (eax=0) to exit
  52.  
  53.         INVOKE    GetLastActivePopup, eax
  54.         mov    hMainWnd,eax        ;eax=hMainWnd or hPopupWnd
  55.  
  56.         INVOKE    IsIconic, hMainWnd
  57.         test    eax,eax
  58.         jz    @F
  59.  
  60.         INVOKE    ShowWindow, hMainWnd, SW_RESTORE
  61.         xor    eax,eax
  62.         jmp    caseRETURN        ;return FALSE (eax=0) to exit
  63.  
  64. @@:        INVOKE    SetForegroundWindow, hMainWnd
  65.         xor    eax,eax            ;return FALSE (eax=0) to exit
  66.  
  67. caseRETURN:    ret
  68. OnlyOneInstance    ENDP
  69.  
  70.  
  71. Initialization    PROC    STDCALL
  72.         LOCAL    wcex:WNDCLASSEX
  73.  
  74.         mov    wcex.cbSize,SIZEOF(WNDCLASSEX)
  75.         mov    wcex.style,CS_HREDRAW + CS_VREDRAW
  76.         mov    wcex.lpfnWndProc, OFFSET WndProc
  77.         xor    eax,eax
  78.         mov    wcex.cbClsExtra,eax
  79.         mov    wcex.cbWndExtra,eax
  80.  
  81.         mov    eax,hInst
  82.         mov    wcex.hInstance,eax
  83.  
  84.         INVOKE    LoadIcon, hInst, IDI_ICON
  85.         mov    wcex.hIcon,eax
  86.  
  87.         INVOKE    LoadCursor, NULL, IDC_ARROW
  88.         mov    wcex.hCursor,eax
  89.  
  90.         mov    wcex.hbrBackground,COLOR_WINDOW + 1
  91.         mov    wcex.lpszMenuName,IDM_MENU
  92.         mov    wcex.lpszClassName,OFFSET szClassName
  93.  
  94.         INVOKE    LoadImage, hInst, IDI_ICON, IMAGE_ICON, 16, 16, NULL
  95.         mov    wcex.hIconSm,eax
  96.  
  97.         INVOKE    RegisterClassEx, ADDR wcex
  98.         test    eax,eax
  99.         jz    caseRETURN        ;return FALSE (eax=0) to exit
  100.  
  101.         INVOKE    CreateWindowEx, NULL,\
  102.             ADDR szClassName, ADDR szClassName,\
  103.             WS_OVERLAPPEDWINDOW,\
  104.             0h, 0h, 1A0h, 180h, NULL, NULL, hInst, NULL
  105.         test     eax,eax
  106.         jz    caseRETURN        ;return FALSE (eax=0) to exit
  107.         mov    hMainWnd,eax
  108.  
  109.         INVOKE    ShowWindow, hMainWnd, nCmdShow
  110.         INVOKE    UpdateWindow, hMainWnd
  111.  
  112. caseRETURN:    ret
  113. Initialization    ENDP
  114.  
  115.  
  116. WinMain        PROC    STDCALL, hInstance:HINSTANCE, hPrevInstance:HINSTANCE, pCmdLine:LPSTR, CmdShow:SDWORD
  117.         LOCAL    msg:MSG
  118.  
  119.         call    OnlyOneInstance
  120.         test    eax,eax
  121.         jz    caseRETURN
  122.  
  123.         call    Initialization
  124.         test    eax,eax
  125.         jz    caseRETURN
  126.  
  127.         INVOKE    LoadAccelerators, hInst, IDA_ACCEL
  128.         test    eax,eax
  129.         jz    caseRETURN
  130.         mov    hAccel,eax
  131.  
  132. MessageLoop:    INVOKE    GetMessage, ADDR msg, NULL, 0h, 0h
  133.         test    eax,eax            ;FALSE (eax=0) if WM_QUIT
  134.         jz    caseWM_QUIT
  135.  
  136.         INVOKE    TranslateAccelerator, msg.hwnd, hAccel, ADDR msg
  137.         test    eax,eax
  138.         jnz    MessageLoop
  139.  
  140.         INVOKE    TranslateMessage, ADDR msg
  141.         INVOKE    DispatchMessage, ADDR msg
  142.         jmp    MessageLoop
  143.  
  144. caseWM_QUIT:    mov    eax,msg.wParam        ;wParam=Exit Code
  145. caseRETURN:    ret
  146. WinMain        ENDP
  147.  
  148.         END    Start